//
//  CZUserAccount.swift
//  crkWeibo
//
//  Created by 陈荣科 on 15/12/20.
//  Copyright © 2015年 crk. All rights reserved.
//

import UIKit

/*
    iOS数据保存方式
        1.偏好设置
        2.归档和解档
        3.NSArray/NSDictionary直接写到Plist
        4.Sqlite数据库
        5.CoreData(核心Sqlite数据库)
*/
class CZUserAccount: NSObject , NSCoding{
    
    //access_token  expires_in  remind_in   uid

    //1.定义属性
    
    //类属性，是否登录
    class var userLogin: Bool {
    
    //计算型属性，get方法可以省略
        return CZUserAccount.loadUserAccount() != nil
        
    }
    
    //用户昵称
    var screen_name: String?
    
    //用户头像地址（大图），180×180像素
    var avatar_large: String?
    
    //用于调用access_token，接口获取授权后的access token。
    var access_token: String?
    
    //access_token的生命周期，单位是秒数
    var expires_in: NSTimeInterval = 0 {
    
        didSet{
            //自己来生产，过期时间NSDate
            expires_Date = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    
    //当前授权用户的UID
    var uid: String?
    
    
    //过期时间
    var expires_Date: NSDate?
    
    //2.字典转模型
    init(dict: [String: AnyObject]){
    
        //属性不是特别多的时候看可以直接单个赋值
        super.init()
        //KVC方法必须在init后面调用
        setValuesForKeysWithDictionary(dict)
    }
    //3.当字典的key在模型里面找不到属性的时候会调用
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        
    }
    
    ///4.打印对象内容
   override var description: String {
        get{
            return "access_token: \(access_token), uid: \(uid), expires_in: \(expires_in), expires_Date: \(expires_Date)"
        }
        
    }
    
    //MARK: - 归档和解档
    ///归档
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeObject(uid, forKey: "uid")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        aCoder.encodeObject(expires_Date, forKey: "expires_Date")
        aCoder.encodeObject(screen_name, forKey: "screen_name")
        aCoder.encodeObject(avatar_large, forKey: "avatar_large")
    }
    
    ///解档
    required init?(coder aDecoder: NSCoder) {
        access_token = aDecoder.decodeObjectForKey("access_token") as? String
        uid = aDecoder.decodeObjectForKey("uid") as? String
        expires_in = aDecoder.decodeDoubleForKey("expires_in")
        expires_Date = aDecoder.decodeObjectForKey("expires_Date") as? NSDate
        avatar_large = aDecoder.decodeObjectForKey("avatar_large") as? String
        screen_name = aDecoder.decodeObjectForKey("screen_name") as? String
        
    }
    
    
    //MARK: - 加载用户数据
    //TODO: 加载用户信息
    func loadUserInfo(finished:(error: NSError?)->()){
        //获得用户信息
        CZNetworkTool.sharedInstance.loadUerInfo { (result, error) -> () in
            //判断是否有错误
            if error != nil || result == nil {
            
//                print("获取用户错误数据：\(error)")
                
                finished(error: error)
                return
            }
            
            //能到这里表示没有错误
            //解析服务器返回的数据，获取用户名称和头像地址
            self.screen_name = result!["screen_name"] as? String
            self.avatar_large = result!["avatar_large"] as? String
            
            
            //对象更新了内容
            //将最新的对象保存到沙盒中
            self.saveUserAccount()
            
            //userAccount是一个类属性，需要使用类名.属性名来访问
            CZUserAccount.userAccount = self
            
            //闭包告诉控制器，用户数据获取成功
            
            finished(error: nil)
        }
    
    }
    
    //使用归档和解档
    ///保存归档账户信息
    //1.获取沙盒路径
    //2.拼接文件名
   static let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("userAccount.plist")
    
//    let path = (scandboxPath as NSString).stringByAppendingPathComponent("userAccount.plist")
    func saveUserAccount(){
        
        
        NSKeyedArchiver.archiveRootObject(self, toFile: CZUserAccount.path)
    }
    
    
    //定义一个静态属性保存沙盒里的用户数据，每次加载都在内存中加载（效率快）
    static var userAccount: CZUserAccount?
    
    
    class func loadUserAccount() -> CZUserAccount? {
        //去内存中看看有没有（userAccount属性）
        if userAccount == nil {
        
            //表示内存没有，去沙盒里面解档账户信息
            //沙盒里面也不一定能解档初账户信息
            userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? CZUserAccount
        }
        
        if userAccount != nil && userAccount?.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            print("加载到可用账号")
            return userAccount
        }
        
        //来到这里表示没有账号或过期
        return nil
        
    }
    ///解档
    //程序一开始没有账号需要解档，写成类方法
    //用户账号信息部一定存在，没有登录，AccessToken过期了
   
    /*
   class  func loadUserAccunt() -> CZUserAccount? {
    
    //判断是否有账号
    if let userAccout = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? CZUserAccount{
    
        //进来说明userAccount有值
        
        //判断是否过期
//        userAccout.expires_Date = NSDate(timeIntervalSinceNow: -100)
        if userAccout.expires_Date?.compare(NSDate()) == NSComparisonResult.OrderedDescending{
        
            //没有过期，账号可用
            print("加载到可用账号")
            return userAccout
        }else{
            print("账号过期")
            return nil
        }
    }else{
    
        print("没有加载到账号")
    }
        return nil
    }
*/

}
